import os

import pyJianYingDraft as draft


def set_up(*args, **kwargs):
    """
    读取指定路径下的文件夹名称，返回全路径列表。

    :return: 文件夹全路径列表
    """
    # 指定需要读取的目录
    directory_path = r"D:\模板11_TOB_\图片_1"
    print(f"[INFO] 正在读取目录：{directory_path}")

    # 检查目录是否存在
    if not os.path.exists(directory_path):
        error_msg = f"指定的路径 {directory_path} 不存在或不是一个有效的目录"
        print(f"[ERROR] {error_msg}")
        raise NotADirectoryError(error_msg)

    # 获取目录下的所有文件和文件夹
    try:
        items = os.listdir(directory_path)
        print(f"[INFO] 成功读取到 {len(items)} 个项目")
    except OSError as e:
        error_msg = f"读取目录 {directory_path} 时发生错误: {e}"
        print(f"[ERROR] {error_msg}")
        raise RuntimeError(error_msg)

    # 构建全路径并过滤出文件夹
    folder_paths = [
        os.path.join(directory_path, item)
        for item in items
        if os.path.isdir(os.path.join(directory_path, item))
    ]

    print(f"[INFO] 找到 {len(folder_paths)} 个子文件夹，准备返回结果")
    return folder_paths


def run(*args, **kwargs):
    # 接受全路径
    script, i, result = args
    print(f"[INFO] 开始执行 run 函数，i={i}, result={result}")

    # 根据i的值确定要读取result列表中的哪个元素
    index = (i) // 5  # 每5个i值对应一个result列表中的元素
    print(f"[INFO] 计算得到 index={index}")

    try:
        target_folder = result[index]  # 获取目标文件夹路径
        print(f"[INFO] 当前目标文件夹路径为：{target_folder}")
    except IndexError:
        error_msg = f"索引超出范围：i={i} 导致 index={index}, 结果列表长度不足 {index + 1}"
        print(f"[ERROR] {error_msg}")
        raise IndexError(error_msg)

    # 检查目标文件夹是否存在
    if not os.path.isdir(target_folder):
        error_msg = f"指定的路径不是一个有效的目录: {target_folder}"
        print(f"[ERROR] {error_msg}")
        raise NotADirectoryError(error_msg)

    # 获取文件夹下的所有文件，并过滤出图片文件（例如以.jpg结尾）
    material_files = [
        f for f in os.listdir(target_folder)
        if f.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp'))
    ]
    print(f"[INFO] 在目标文件夹中找到 {len(material_files)} 个 .jpg 图片文件")

    # 最多使用5个图片文件进行替换
    used_files = material_files[:6]
    print(f"[INFO] 即将使用其中的 {len(used_files)} 个文件进行替换操作")

    for idx, material_file in enumerate(used_files, start=1):
        material_path = os.path.join(target_folder, material_file)
        new_material = draft.Video_material(material_path)
        script.replace_material_by_name(material_name=f"图片_{idx+2}.jpg", material=new_material)
        print(f"[INFO] 已替换素材：图片_{idx}.jpg -> {material_path}")

    print("[INFO] 所有替换完成，返回脚本对象")
    return script
